package com.example.service.impl;

import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.entity.User;
import com.example.mapper.UserMapper;
import com.example.service.UserService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * 用户服务实现类
 * 使用方法级别的@DS注解实现读写分离
 *
 * @author example
 */
@Service
@Transactional
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    
    // 查询操作使用从库（slave）
    @DS("slave")
    @Override
    public List<User> getUsersByAge(Integer age) {
        return baseMapper.selectByAge(age);
    }
    
    // 查询操作使用从库（slave）
    @DS("slave")
    @Override
    public List<User> list() {
        return super.list();
    }
    
    // 查询操作使用从库（slave）
    @DS("slave")
    @Override
    public User getById(java.io.Serializable id) {
        return super.getById(id);
    }
    
    // 写操作使用主库（master）
    @DS("master")
    @Override
    public boolean save(User entity) {
        return super.save(entity);
    }
    
    // 写操作使用主库（master）
    @DS("master")
    @Override
    public boolean updateById(User entity) {
        return super.updateById(entity);
    }
    
    // 写操作使用主库（master）
    @DS("master")
    @Override
    public boolean removeById(java.io.Serializable id) {
        return super.removeById(id);
    }
    
    // 指定数据源的增删改查方法实现
    
    @Override
    public boolean saveTo(String dataSource, User entity) {
        if ("master".equals(dataSource)) {
            return saveToMaster(entity);
        } else if ("slave".equals(dataSource)) {
            return saveToSlave(entity);
        }
        throw new IllegalArgumentException("不支持的数据源: " + dataSource);
    }
    
    @DS("master")
    private boolean saveToMaster(User entity) {
        return super.save(entity);
    }
    
    @DS("slave")
    private boolean saveToSlave(User entity) {
        return super.save(entity);
    }
    
    @Override
    public List<User> listFrom(String dataSource) {
        if ("master".equals(dataSource)) {
            return listFromMaster();
        } else if ("slave".equals(dataSource)) {
            return listFromSlave();
        }
        throw new IllegalArgumentException("不支持的数据源: " + dataSource);
    }
    
    @DS("master")
    private List<User> listFromMaster() {
        return super.list();
    }
    
    @DS("slave")
    private List<User> listFromSlave() {
        return super.list();
    }
    
    @Override
    public User getByIdFrom(String dataSource, java.io.Serializable id) {
        if ("master".equals(dataSource)) {
            return getByIdFromMaster(id);
        } else if ("slave".equals(dataSource)) {
            return getByIdFromSlave(id);
        }
        throw new IllegalArgumentException("不支持的数据源: " + dataSource);
    }
    
    @DS("master")
    private User getByIdFromMaster(java.io.Serializable id) {
        return super.getById(id);
    }
    
    @DS("slave")
    private User getByIdFromSlave(java.io.Serializable id) {
        return super.getById(id);
    }
    
    @Override
    public boolean updateByIdIn(String dataSource, User entity) {
        if ("master".equals(dataSource)) {
            return updateByIdInMaster(entity);
        } else if ("slave".equals(dataSource)) {
            return updateByIdInSlave(entity);
        }
        throw new IllegalArgumentException("不支持的数据源: " + dataSource);
    }
    
    @DS("master")
    private boolean updateByIdInMaster(User entity) {
        return super.updateById(entity);
    }
    
    @DS("slave")
    private boolean updateByIdInSlave(User entity) {
        return super.updateById(entity);
    }
    
    @Override
    public boolean removeByIdFrom(String dataSource, java.io.Serializable id) {
        if ("master".equals(dataSource)) {
            return removeByIdFromMaster(id);
        } else if ("slave".equals(dataSource)) {
            return removeByIdFromSlave(id);
        }
        throw new IllegalArgumentException("不支持的数据源: " + dataSource);
    }
    
    @DS("master")
    private boolean removeByIdFromMaster(java.io.Serializable id) {
        return super.removeById(id);
    }
    
    @DS("slave")
    private boolean removeByIdFromSlave(java.io.Serializable id) {
        return super.removeById(id);
    }
} 